import { defineStore } from "pinia";
import { type Lookup } from "geoip-lite";

enum VersionOldEnum {
  yes = 1, // 老版本
  no = 0, // 不是
  unknown = -1, // 未知
}

// 弹窗队列任务信息
interface popupQueueItem {
  path?: string; // 要弹出的页面. 没有则代表全局
}

interface GlobalState {
  tabBarPages: any[]; // tabbar 的页面顺序
  tabBarIdx: number; // 当前激活的 tabar 索引
  isTabBarRewardsDot?: boolean; // Tabbar 活动-页面红点是否显示
  isTabBarPledgeDot?: boolean; // Tabbar 质押-页面红点是否显示
  isDebugger?: boolean; // 是否是调试模式
  packageId: string; // 包版本
  facebookAppId?: string; // facebook AppId
  googleClientId?: string; // google AppId
  packagePrefix?: string; // 版本前缀-用于区分是那个包
  language: string;
  token: string;
  channel: string; // 从哪里进入的 h5, 来源
  isCallAppDone: boolean; // callAPP 是否执行完成; 默认 false

  nginxSecurityIp?: string | string[];
  publicIp?: string;
  xForwardedFor?: string | string[];
  xRealIp?: string | string[];
  geo?: Lookup;
  publicArea?: number; // ip地区: +62

  statusBarHeight?: number;
  isDhApp: Boolean; // 是不是在 自己的 APP 中加载的
  isRetry: Boolean; // isRetry 如果桥接没有获取到 Token,单页面切换,或者,再次进入h5页面后会重试，获取 token
  isiOS: Boolean; // 是不是 iOS 设备
  IsIphoneX?: Boolean; // 是不是 iphone X 设备
  isOldVersion: VersionOldEnum; // 是不是 老版本
  diviceType?: string; // 设备类型
  asyncNums: number; //  同时上报数量
  serverTime?: string | number; // 服务器时间

  isShowIngPopupId: string; // 当前是否有弹窗弹出: 有的话,弹窗 ID ; 没有 ''
  popupQueues?: any; // 保存需要弹出的,弹窗任务队列; 页面路径作为 key, value 是弹窗数组[]

  isInterceptAppBack: boolean; // 是否拦截 app 返回按钮和侧滑事件
}

// 你可以对 `defineStore()` 的返回值进行任意命名，但最好使用 store 的名字，同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`，`useCartStore`，`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useGlobalStore = defineStore("global/state", {
  // 其他配置...
  state: (): GlobalState => {
    return {
      // 后面有时间把这个改成枚举
      tabBarPages: [
        "mvp-coin-coin__",
        "activity__",
        "mvp-mining__",
        "pledge__",
        "mvp-assetDetails__",
      ],
      tabBarIdx: -1,
      isDhApp: false,
      packageId: "",
      language: "",
      token: "",
      nginxSecurityIp: undefined,
      xForwardedFor: undefined,
      publicIp: undefined,
      xRealIp: undefined,
      geo: undefined,
      publicArea: undefined, // ip地区: +62
      statusBarHeight: 0,
      isRetry: true,
      isiOS: false,
      isOldVersion: VersionOldEnum.unknown,
      asyncNums: 0,
      diviceType: "未知",
      serverTime: 0,
      isShowIngPopupId: "",
      popupQueues: {},
      isCallAppDone: false,
      channel: "",
      isInterceptAppBack: false,
    };
  },
  getters: {
    // token 存在，且未失效
    isLogin(state) {
      if (state.token) {
        return true;
      } else {
        const t = localStorage.getItem("token");
        if (t) {
          return true;
        }
      }
    },
    // packagePrefix: string;  版本前缀-用于区分是那个包
    packagePrefix(state) {
      const versionStrs = state.packageId.split("-");
      return versionStrs[0] || "";
    },
  },
  actions: {
    /**
     * @description: 删除本地 token 缓存
     */
    removeLocalToken() {
      // 1. 优先 删除本地缓存,避免监听事件触发顺序问题
      localStorage.removeItem("token");
      // 2. 清除状态
      this.token = "";
    },
    /**
     * @description: 设置 用户 token 的值
     */
    setUserToken(val: string) {
      this.token = val;
    },
  },
});
